package com.smsc.headend.task.engine.service.task;

import com.baomidou.mybatisplus.extension.service.IService;
import com.smsc.headend.module.task.dto.AtomicTask;
import com.smsc.headend.module.task.dto.SubTaskStatusDto;
import com.smsc.headend.module.task.dto.Task;
import com.smsc.headend.module.task.dto.TaskStatusDto;
import com.smsc.headend.module.task.entity.DeviceTask;
import com.smsc.headend.module.task.enums.TaskStatus;

import java.util.List;

/**
 * Service for persistent task info to Relational Database
 */
public interface DeviceTaskService extends IService<DeviceTask> {

    /**
     * save device Task and subTask
     * @param task
     */
    DeviceTask addDeviceTask(Task task);

    void batchAddDeviceTask(List<DeviceTask> deviceTasks);

    boolean isTaskSubPersist(Task task);

    /**
     * update device task state according to atomicTask  (the first atomic start)
     * @param task
     * @param atomicTask
     */
    void updateSubDeviceTaskStart(Task task, AtomicTask atomicTask);

    /**
     * 发送更新subTask状态的消息
     * @param task
     * @param sort
     * @param code
     */
    void sendSubTaskMessageUpdate(Task task, Integer sort, int code);

    /**
     * 发送更新subTask状态的消息
     * @param taskNo
     * @param sort
     * @param code
     */
    void sendSubTaskMessageUpdate(String taskNo, Integer sort, int code);
    /**
     * 发送更新Task状态消息
     * @param task
     * @param messageId
     * @param suspending
     * @return
     */
    Integer sendTaskStatusUpdateMessage(Task task, String messageId, TaskStatus suspending);

    /**
     * 更新Task状态位完成  并将所有等待中的subTask状态改为 subTaskStatus
     * @param task
     * @param subTaskStatus
     */
    void updateRequestDeviceTask(Task task, Integer subTaskStatus);

    DeviceTask getTaskByTaskNo(String taskNo);

    void batchInsertTaskProcess(List<TaskStatusDto> dtoList);

    void batchInsertSubTaskStatus(List<SubTaskStatusDto> dtoList);

    Integer getTaskStatus(String taskNo);

    DeviceTask getTaskTvAndStatus(String taskNo);

    DeviceTask updateTaskTvAndStatusCache(TaskStatusDto dto);

    String estimateSingleDeviceTaskTime(Long deviceType, Long deviceId);

    void clearEstimateCache(Long comId, Long deviceId);
}
